package com.zxjbyte.yiyi.framework.oss.storage.s3;

import com.zxjbyte.yiyi.framework.oss.enums.PolicyType;
import com.zxjbyte.yiyi.framework.oss.storage.FileMetadata;
import com.zxjbyte.yiyi.framework.oss.storage.OssOperations;
import com.zxjbyte.yiyi.framework.oss.storage.OssPutResult;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * @Author zhangxingjia
 * @Date 2023/6/19 15:27
 * @Version: 1.0
 */
public interface S3OssOperations extends OssOperations {

    /**
     * 创建 存储桶
     *
     * @param bucketName 存储桶名称
     */
    void createBucket(String bucketName);

    /**
     * 创建 存储桶
     *
     * @param bucketName 存储桶名称
     * @param policyType 策略配置
     */
    void createBucket(String bucketName, PolicyType policyType);

    /**
     * 存储桶是否存在
     *
     * @param bucketName 存储桶名称
     * @return boolean
     */
    boolean bucketExists(String bucketName);

    /**
     * 删除 存储桶
     *
     * @param bucketName 存储桶名称
     */
    void removeBucket(String bucketName);

    /**
     * 拷贝文件
     *
     * @param bucketName     存储桶名称
     * @param fileName       存储桶文件名称
     * @param tBucketName 目标存储桶名称
     */
    void copyFile(String bucketName, String fileName, String tBucketName);

    /**
     * 拷贝文件
     *
     * @param bucketName     存储桶名称
     * @param fileName       存储桶文件名称
     * @param tBucketName 目标存储桶名称
     * @param tFileName   目标存储桶文件名称
     */
    void copyFile(String bucketName, String fileName, String tBucketName, String tFileName);

    /**
     * 上传文件
     *
     * @param file 上传文件类
     * @return BladeFile
     */
    OssPutResult putFile(MultipartFile file);

    /**
     * 上传文件
     *
     * @param file       上传文件类
     * @param bucketName 存储桶名称
     * @param fileName   上传文件名
     * @return BladeFile
     */
    OssPutResult putFile(MultipartFile file, String bucketName, String fileName);

    /**
     * 上传文件
     *
     * @param file       上传文件类
     * @param fileName   上传文件名
     * @return BladeFile
     */
    OssPutResult putFile(MultipartFile file, String fileName);

    /**
     * 上传文件
     *
     * @param fileBytes  上传文件数据
     * @param bucketName 存储桶名称
     * @param fileName   上传文件名
     * @return BladeFile
     */
    OssPutResult putFile(byte[] fileBytes, String bucketName, String fileName);

    /**
     * 上传文件
     *
     * @param fileBytes  上传文件数据
     * @param fileName   上传文件名
     * @return BladeFile
     */
    OssPutResult putFile(byte[] fileBytes, String fileName);

    /**
     * 上传文件
     *
     * @param input   文件流
     * @param bucketName 存储桶名称
     * @param fileName 存储桶对象名称
     * @return BladeFile
     */
    OssPutResult putFile(InputStream input, String bucketName, String fileName);

    /**
     * 获取文件信息
     *
     * @param bucketName 存储桶名称
     * @param fileName   存储桶文件名称
     * @return FileMetadata
     */
    FileMetadata statFile(String bucketName, String fileName);

    /**
     * 删除文件
     *
     * @param bucketName 存储桶名称
     * @param fileName   存储桶对象名称
     */
    boolean deleteFile(String bucketName, String fileName);
}
